In a data processing or computing system comprised of a host system and at least one subsystem, there is a need to communicate direct and indirect commands to an individual subsystem, usually over an I/0 channel.
The direct command is one which can be directly sent to a subsystem in one operation, is completely and totally self-contained, and totally specifies an operation to be executed by the subsystem. On the other hand, an indirect command is one which requires more data to specify the operation than can be provided within one channel I/O cycle. The indirect command is itself a pointer to a block of system memory which contains all the parameters necessary to totally specify an operation to be performed by the subsystem. This block of memory is often referred to as a "control block".
In all computer systems, there exists at least one I/O instruction which enables the program running in the host system to send data and/or commands over its external interface or channel. The amount of data that can be sent with each I/O operation, as well as the status received from the channel or subsystem relative to the acceptance or completion of the operation is system dependent.
In computers of the class typified by the IBM Series/1, the operation of which is described in "Series/1 Principles of Operation", IBM publication order number GA34-0152-0, every I/O Operation transferred the following information to peripheral attachment cards installed in the Series/1 I/O channel:
(1) The address of the subsystem to which the command is directed. PA1 (2) An 8-bit command field that indicated whether the operation was direct or indirect. PA1 (3) A 16-bit data word which either contained data with respect to a direct command, or an address of a device control block (DCB) in the case of an indirect command.
In addition, during execution of each I/O instruction Cycle on the channel, status was presented through various indicators to record a condition code specifying the status of the I/O operation. This immediate, real-time status allowed the host program to determine whether the command was accepted by the subsystem successfully, or whether an error condition occurred such as "Device Not Attached" or "Immediate Command Reject". In the case of an error, the host program could retry the command at a later time.
Because the Series/1 subsystems could immediately accept or reject an I/O command, there was no need to use a priority interrupt or other mechanism to report immediate status to the host program.
In order to ensure the integrity of an entire system, there must always be a mechanism to report whether or not an I/O command is accepted for execution by the subsystem. The host system cannot assume that a command is successfully accepted by the subsystem because there are many modes of failure which could remain undetected and therefore unrecoverable.
The need to have complex commands on a personal computer class machine is indicated by the growing complexities of the I/O subsystems that are utilized in state-of-the-art computing systems.
According to the present invention, this need is met by providing a mechanism to transmit commands in the form of subsystem Control Blocks (SCB's) between a host system and a plurality of subsystems. Rather than having a unique processor instruction for delivery of the address field and command type fields as in the Series/1, these fields are provided to a single port, called an attention port to accommodate the present instruction set of common Intel 80286/386/486 base processor systems. It is to be appreciated that other processor based systems may be utilized in the practice of the invention. A command interface port receives direct or indirect commands.
Also, as in the Series/1 type machine, a mechanism did not exist in the personal computer class machines for reporting immediate status when communicating direct or indirect commands across the I/O channel. This need is met by providing a Command Busy/Status Port within each subsystem to provide status of a previous I/O operation, as well as providing the current state of the subsystem. This port can be read by the host program using an I/O read command which does not alter or update the status in this port. Only output (write) commands directed to other ports within a subsystem affect the status in the Command Busy/Status Port.